package com.yuran.ranCloud.service.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.yuran.common.config.RuoYiConfig;
import com.yuran.common.utils.DateUtils;
import com.yuran.common.utils.SecurityUtils;
import com.yuran.ranCloud.domain.FileTree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yuran.ranCloud.mapper.RanCloudFilesMapper;
import com.yuran.ranCloud.domain.RanCloudFiles;
import com.yuran.ranCloud.service.IRanCloudFilesService;

/**
 * 云盘文件Service业务层处理
 * 
 * @author yuran
 * @date 2023-11-23
 */
@Service
public class RanCloudFilesServiceImpl implements IRanCloudFilesService 
{
    @Autowired
    private RanCloudFilesMapper ranCloudFilesMapper;

    /**
     * 查询云盘文件
     * 
     * @param fileId 云盘文件主键
     * @return 云盘文件
     */
    @Override
    public RanCloudFiles selectRanCloudFilesByFileId(Long fileId)
    {
        return ranCloudFilesMapper.selectRanCloudFilesByFileId(fileId);
    }

    /**
     * 查询云盘文件列表
     * 
     * @param ranCloudFiles 云盘文件
     * @return 云盘文件
     */
    @Override
    public List<RanCloudFiles> selectRanCloudFilesList(RanCloudFiles ranCloudFiles)
    {
        return ranCloudFilesMapper.selectRanCloudFilesList(ranCloudFiles);
    }

    /**
     * 新增云盘文件
     * 
     * @param ranCloudFiles 云盘文件
     * @return 结果
     */
    @Override
    public int insertRanCloudFiles(RanCloudFiles ranCloudFiles)
    {
        ranCloudFiles.setCreateTime(DateUtils.getNowDate());
        return ranCloudFilesMapper.insertRanCloudFiles(ranCloudFiles);
    }

    /**
     * 修改云盘文件
     * 
     * @param ranCloudFiles 云盘文件
     * @return 结果
     */
    @Override
    public int updateRanCloudFiles(RanCloudFiles ranCloudFiles)
    {
        ranCloudFiles.setUpdateTime(DateUtils.getNowDate());
        return ranCloudFilesMapper.updateRanCloudFiles(ranCloudFiles);
    }

    /**
     * 批量删除云盘文件
     * 
     * @param fileIds 需要删除的云盘文件主键
     * @return 结果
     */
    @Override
    public int deleteRanCloudFilesByFileIds(Long[] fileIds)
    {
        return ranCloudFilesMapper.deleteRanCloudFilesByFileIds(fileIds);
    }

    /**
     * 删除云盘文件信息
     * 
     * @param fileId 云盘文件主键
     * @return 结果
     */
    @Override
    public int deleteRanCloudFilesByFileId(Long fileId)
    {
        return ranCloudFilesMapper.deleteRanCloudFilesByFileId(fileId);
    }

    /**
     * 查询真实文件路径
     * @param filePath
     * @return
     * @throws IOException
     */
    @Override
    public List realFilesQuery(String filePath) throws IOException {
        File file = new File(RuoYiConfig.getCloudFile() + filePath);
        // 文件夹路径不存在创建：默认第一个进入创建
        if(!file.exists()) file.mkdirs();
        File[] files = file.listFiles();
        List fileTree = new ArrayList();
        // 文件夹集合
        List fileTreeFile = new ArrayList();
        // 遍历当前文件夹内的文件和文件夹
        for (File file1 : files) {
            // 定义文件树
            FileTree fileTree1 = new FileTree();
            // 获取路径
            String path = file1.getPath();
            // 获取文件或文件夹名称
            fileTree1.setFileName(file1.getName());
            // 过滤路径
            if(filePath.equals("/")){
                fileTree1.setFileUrl(path);
            }else {
                fileTree1.setFileUrl(path.substring(path.indexOf(SecurityUtils.getUserId().toString())));
            }
            // 判断类型是文件还是文件夹
            if (file1.isDirectory()){
                fileTree1.setFileType("文件夹");
                fileTreeFile.add(fileTree1);
            }else if (file1.isFile()){
                FileInputStream fis = null;
                fis = new FileInputStream(file1);
                Double available = Double.valueOf(fis.available());
                String resultSize = "0KB";
                DecimalFormat df = new DecimalFormat("#.0");
                if(available != 0){
                    if(available < 102.4){
                        resultSize = "0.1KB";
                    }else if (available <= 1024000){
                        resultSize = df.format(available / 1024) + "KB";
                    }else if (available < 1048576000 ){
                        resultSize = df.format(available / 1048576) + "M";
                    }else if (available <= 1073741824000L) {
                        resultSize = df.format(available / 1073741824L ) + "G";
                    }
                }
                fileTree1.setFileSize(resultSize);
                fis.close();
                BasicFileAttributes attributes = null;
                attributes = Files.readAttributes(file1.toPath(), BasicFileAttributes.class);
                FileTime lastModifiedTime = attributes.lastModifiedTime();
                Date date = new Date(lastModifiedTime.toMillis());
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                fileTree1.setFileUpdate(simpleDateFormat.format(date));
                fileTree1.setFileType(path.substring(path.lastIndexOf(".") + 1));
                fileTree.add(fileTree1);
            }
        }
        // 文件集合添加如文件夹集合：实现文件夹一直处于最上面
        fileTree.addAll(fileTreeFile);
        return fileTree;
    }

    /**
     * 真实创建文件夹
     * @param filePath
     * @return
     */
    @Override
    public boolean realCreateFile(String filePath) {
        String path = RuoYiConfig.getUploadPathRan() + "/" + filePath;
        File folder = new File(path);
        return folder.mkdir();
    }

    /**
     * 真实删除文件
     * @param filePath
     * @return
     */
    @Override
    public boolean realDeleteFile(String filePath) {
        // 删除文件路径
        String path = RuoYiConfig.getUploadPathRan() + "/" + filePath;
        File file = new File(filePath);
        return deleteFolder(file);
    }

    // 删除文件夹内的所有内容
    private boolean deleteFolder(File folder) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        // 是否是文件夹
                        if (!deleteFolder(file)) {
                            return false;
                        }
                    } else {
                        // 删除文件：用于删除文件夹内的文件
                        if (!file.delete()) {
                            return false;
                        }
                    }
                }
            }
        }
        // 删除文件
        return folder.delete();
    }
}
